home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 4: GNU Archives / Linux Cubed Series 4 - GNU Archives.iso / gnu / glibc-1.09 / glibc-1 / glibc-1.09.1 / sysdeps / i386 / rshift.S < prev    next >
Encoding:
Text File  |  1994-09-02  |  2.0 KB  |  86 lines

  1. # i80386 __mpn_rshift -- 
  2.  
  3. # Copyright (C) 1992, 1994 Free Software Foundation, Inc.
  4.  
  5. # This file is part of the GNU MP Library.
  6.  
  7. # The GNU MP Library is free software; you can redistribute it and/or modify
  8. # it under the terms of the GNU Library General Public License as published by
  9. # the Free Software Foundation; either version 2 of the License, or (at your
  10. # option) any later version.
  11.  
  12. # The GNU MP Library is distributed in the hope that it will be useful, but
  13. # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  14. # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
  15. # License for more details.
  16.  
  17. # You should have received a copy of the GNU Library General Public License
  18. # along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
  19. # the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  
  21.  
  22. # INPUT PARAMETERS
  23. # res_ptr    (sp + 4)
  24. # s_ptr        (sp + 8)
  25. # size        (sp + 12)
  26. # cnt        (sp + 16)
  27.  
  28. #include "sysdep.h"
  29. #include "asm-syntax.h"
  30.  
  31. .text
  32.     .align 2
  33.     .globl C_SYMBOL_NAME(__mpn_rshift)
  34. C_SYMBOL_NAME(__mpn_rshift):
  35.     pushl    %edi
  36.     pushl    %esi
  37.     pushl    %ebx
  38.  
  39.     movl    16(%esp),%edi    # res_ptr
  40.     movl    20(%esp),%esi    # s_ptr
  41.     movl    24(%esp),%edx    # size
  42.     movl    28(%esp),%ecx    # cnt
  43.  
  44.     leal    -4(%edi,%edx,4),%edi
  45.     leal    (%esi,%edx,4),%esi
  46.     negl    %edx
  47.  
  48.     movl    (%esi,%edx,4),%ebx    # read least significant limb
  49.     xorl    %eax,%eax
  50.     shrdl    %cl,%ebx,%eax        # compute carry limb
  51.     incl    %edx
  52.     jz    Lend
  53.     pushl    %eax            # push carry limb onto stack
  54.     testb    $1,%edx
  55.     jnz    L1            # enter loop in the middle
  56.     movl    %ebx,%eax
  57.  
  58.     .align    2,0x90
  59. Loop:    movl    (%esi,%edx,4),%ebx    # load next higher limb
  60.     shrdl    %cl,%ebx,%eax        # compute result limb
  61.     movl    %eax,(%edi,%edx,4)    # store it
  62.     incl    %edx
  63. L1:    movl    (%esi,%edx,4),%eax
  64.     shrdl    %cl,%eax,%ebx
  65.     movl    %ebx,(%edi,%edx,4)
  66.     incl    %edx
  67.     jnz    Loop
  68.  
  69.     shrl    %cl,%eax        # compute most significant limb
  70.     movl    %eax,(%edi)        # store it
  71.  
  72.     popl    %eax            # pop carry limb
  73.  
  74.     popl    %ebx
  75.     popl    %esi
  76.     popl    %edi
  77.     ret
  78.  
  79. Lend:    shrl    %cl,%ebx        # compute most significant limb
  80.     movl    %ebx,(%edi)        # store it
  81.  
  82.     popl    %ebx
  83.     popl    %esi
  84.     popl    %edi
  85.     ret
  86.